 /* 
 * Copyright 2013 Dominik Korittki, Steffen Gruschka

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

package entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import org.hibernate.validator.constraints.Length;

/**
 * Repräsentation eines Raumes im System
 * @author Dominik Korittki
 * @author Steffen Gruschka
 */
@Entity
public class Raum implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID des Raumes
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    /**
     * Name oder Bezeichnung des Raumes
     */
    @Column(nullable=false)
    @Length(min=1, max=30, message="Validation: Raumname muss zwischen 1 und 30 Zeichen haben!")
    private String name;
    /**
     * Gebäude, in welchem der Raum sitzt
     */
    @Column(nullable=false)
    @Length(max=50, message="Validation: Gebäudename darf nicht länger als 50 Zeichen sein!")
    private String gebauede;
    /**
     * Mitarbeiter, welche Zutritt zu diesem Raum haben (=Befugte)
     */
    @ManyToMany
    private List<Mitarbeiter> befugte = new ArrayList<Mitarbeiter>();

    /**
     * Liefert die id
     * @return Die id
     */
    public Long getId() {
        return id;
    }

    /**
     * Setzt eine neue ID
     * @param id Neue ID
     */
    public void setId(Long id) {
        this.id = id;
    }

    
    /**
     * Liefert das Gebäude
     * @return Das Gebäude
     */
    public String getGebauede() {
        return gebauede;
    }

    
    /**
     * Setzt ein neues Gebäude
     * @param gebauede Neues Gebäude
     */
    public void setGebauede(String gebauede) {
        this.gebauede = gebauede;
    }
    
    
    /**
     * Liefert den Namen
     * @return der Name
     */
    public String getName() {
        return name;
    }

    
    /**
     * Setzt einen neuen Namen
     * @param name Neuer Name
     */
    public void setName(String name) {
        this.name = name;
    }
    
    /**
     * Liefert der befugte Objekt
     * @return Das Objekt
     */
    public List<Mitarbeiter> getBefugte() {
        return befugte;
    }

    /**
     * Setzt ein neues Befugte Objekt
     * @param befugte Neues Objekt
     */
    public void setBefugte(List<Mitarbeiter> befugte) {
        this.befugte = befugte;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Raum)) {
            return false;
        }
        Raum other = (Raum) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.Raum[ id=" + id + " ]";
    }

    /**
     * Mitarbeiter als Befugten zu diesem Raum hinzufügen
     * @param m hinzuzufügender Mitarbeiter
     */
    public void befugtenHinzufuegen(Mitarbeiter m) {
        befugte.add(m);
    }
    
    /**
     * Befugten aus diesem Raum entfernen
     * @param m Zu entfernenden Befugten
     */
    public void befugtenEntfernen(Mitarbeiter m) {
        befugte.remove(m);
    }
    
    /**
     * Diesen Raum für niemanden zugänglich machen
     */
    public void alleBefugtenEntfernen() {
        befugte.clear();
    }
    
}
